#ifndef HTTP_CONN_H
#define HTTP_CONN_H

#include "../buffer/buffer.h"
#include "httprequest.h"
#include "httpresponse.h"

#include <atomic>
#include <netinet/in.h>
#include <unistd.h>

class HttpConn {
public:
    HttpConn();
    ~HttpConn();

    void init(int sockFd, const sockaddr_in& addr);

    ssize_t read(int* saveErrno);

    ssize_t write(int* saveErrno);

    void Close();

    int GetFd() const;

    int GetPort() const;

    const char* GetIP() const;
    
    sockaddr_in GetAddr() const;

    bool process();

    int ToWriteBytes() {
        return iov_[0].iov_len + iov_[1].iov_len;
    }

    bool IsKeepAlive() const {
        return request_.IsKeepAlive();
    }

    // 是否使用边缘触发模式（ET）？
    static bool isET;
    // 资源文件目录
    static const char* srcDir;
    // 实时并发用户数
    static std::atomic<int> userCount;

private:
    // 套接字文件描述符
    int fd_;
    // 连接的IP和端口信息
    sockaddr_in addr_;

    // 标记连接是否关闭
    bool isClose_;

    // 有效的iovec数量
    int iovCnt_;
    iovec iov_[2];

    // 读写缓冲区
    Buffer readBuff_;
    Buffer writeBuff_;

    // 用于存储请求和相应报文
    HttpResponse response_;
    HttpRequest request_;
};

#endif